#include <stdio.h>
#include <stdlib.h>
#include "linkList.h"

LinkList_t* createLinkList(){
    LinkList_t* table=NULL;
    table=malloc(sizeof(LinkList_t));
    if(table == NULL){
        return NULL;
    }//malloc失败返回NULL

    table->count=0;//成功
    table->head.val=0;//头节点的值可任意
    table->head.next=NULL;
    return table;
}

//头插法
int insertLinkListHeader(LinkList_t* link_table,Element_t val){
    node_t* p = &link_table->head;//定义了一个指针变量p，指向link_table表头的head，而head是一个头结点，也是一个节点结构，因此其中包含指针域next和数据域val
    node_t* new_node = malloc(sizeof(node_t));//而由于head是一个节点，因此定义一个指针变量指向它就必须要带上取地址操作符&
    if(new_node == NULL){
        return -1;
    }

    new_node->val = val;

    new_node->next = p->next;
    p->next = new_node;

    link_table->count++;

    return 0;
}

int deleteLinkListElement(LinkList_t* link_table,Element_t val){
    node_t *p = &link_table->head;
    while(p->next){
        if(p->next->val == val){
            break;
        }
        p = p->next;
    }
    if(p->next == NULL){
        printf("Not find!\n");
        return -1;
    }
    //删除逻辑
    node_t* tmp = p->next;
    p->next = tmp->next;
    free(tmp);

    link_table->count--;
    return 0;
}

void showLinkList(const LinkList_t* link_table){
    //辅助指针指向第一个元素，辅助指针不断向后指向，直到遇到NULL
    node_t* p =link_table->head.next;
    printf("linklist:%d\n",link_table->count);
    while(p){
        printf("%d\t",p->val);
        p = p->next;
    }
    printf("\n");
}

//释放整个表
void releaseLinkList(LinkList_t* link_table){
    if(link_table){
       node_t* p = link_table->head.next;
       node_t* tmp = NULL;

       while (p)
       {
        tmp = p;
        p = p->next;
        free(tmp);
        link_table->count--;

       }

       printf("The linklist's count is %d \n",link_table->count);

       free(link_table);
       
    }
}

int insertLinkListPos(LinkList_t* link_table,int pos,Element_t val){
    //插入位置pos的正确性
    if(pos < 0 || pos > link_table->count){
        printf("insert pos invalid!\n");
        return -1;
    }
    node_t* p = &link_table->head;
    int index = -1;

    while(p && index < pos - 1){
        p = p->next;
        index++;
    }
    if(p == NULL){
        return -1;
    }
    //如果以上条件均成立，那么我们就可以malloc创建这个新节点了
    node_t* new_node = malloc(sizeof(node_t));
    new_node->val = val;
    new_node->next = p->next;
    p->next = new_node;
    link_table->count++;

    return 0;
}